#include<iostream>
#include<vector>
using namespace std;
/*
你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，
如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。
解题思路：
本题是一个明显的动态规划的递推思想，给定一个数组[1,5,6,8,9],
定义dp数组dp[j]代表的含义是考虑下标为j的元素（以及之前）所能偷到的最大值
如何去推递推公式，在下标为j的地方有两种状态，一种是去偷j一种是不去偷j，若偷j则j-1不被考虑，只考虑j-2以及前面的数
另一种是不去偷j，则考虑j-1以及j-1前面的数
所以可以得到递推公式:dp[j] =  max(nums[j]+dp[j-2],dp[j-1])
*/
int dp(vector<int> nums)
{
    vector<int> dp(nums.size());
    if(nums.size()<2)
        return nums[0];
    //初始化dp数组
    dp[0] = nums[0];
    dp[1] = max(nums[0],nums[1]);
    if(nums.size()<3)
        return dp[1];
    for(int i=2;i<nums.size();i++)
        dp[i] = max(dp[i-2]+nums[i],dp[i-1]);
    //递推的最后一位是数组下标最大元素
    return dp[nums.size()-1];
}
int main()
{
    cout<<"enter a numebr:"<<endl;
    int number;
    cin>>number;
    cout<<"enter nums:"<<endl;
    vector<int> nums(number);
    for(int i=0;i<number;i++)
        cin>>nums[i];
    cout<<dp(nums);
    return 0;
}